//
//  UserAccountViewModel.swift
//  Weibo10
//
//  Created by Leon on 15/10/17.
//  Copyright © 2015年 Leon. All rights reserved.
//

import UIKit
import SVProgressHUD
/*
管理当前登录用户的账户信息
加载归档保存的用户账户信息，避免重复从沙盒加载
用户登录判断
抽取网络请求代码
调整网络代码，简化 token 的调用
*/
class UserAccountViewModel {
    
    /// 单例
    static let shareAccount = UserAccountViewModel()
    
    /// 是否登录成功标示
    var userLogon: Bool {
        
        return UserAccountViewModel.shareAccount.account?.access_token != nil && !isExpired
    }
    /// 用户模型
    var account: UserAccount?
    
    /// 返回有效 accessToken
    var accessToken: String? {
        
        if !isExpired {
            return account?.access_token
        }
        
        return nil
    }
    
    /// 头像URL
    var avatarURL: NSURL {
    
        return NSURL(string: (account?.avatar_large)!)!
 
    }
    
    /// 归档路径
    private var accontPath: String {
    
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    
    // MARK: - 构造函数
    private init() {
        // 解档
        account =  NSKeyedUnarchiver.unarchiveObjectWithFile(accontPath) as? UserAccount
        
        // 如果账号修改，或者token过期
        if isExpired {
            print("token过期")
            account = nil
        }
    }
    
    /// 是否过期
    private var isExpired: Bool {
        
        if account?.expireData?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            // 没有过期
            return false
        }
        // 过期
        return true
    }
}

// MARK: - 网络业务逻辑方法
/*
代码重构的步骤
1. 新方法
2. 粘贴代码
3. 根据上下文调整参数和返回值
4. 移动其他`子`方法
*/
extension UserAccountViewModel {
    /**
    获取AccessToken的值
    
    - parameter code:     授权码
    - parameter finished: 完成回调
    */
    func loadAccessToken(code: String, finished:(isSuccessed: Bool) -> ()) {
        
        NetworkTools.shareTools.loadAccessToken(code) { (result, error) -> () in
            
            // 1 判断错误
            if error != nil {
                print("出错了")
                finished(isSuccessed: false)
                return
            }
            
            // 输出结果
            self.account = UserAccount(dict: result as! [String: AnyObject])
            self.loadUserInfo(self.account!, finished: finished)
        }
    }
    
    
    /// 获取userInfo 的值
    private func loadUserInfo(account: UserAccount, finished:(isSuccessed: Bool) -> ()) {
        
        NetworkTools.shareTools.loadUserInfo(account.uid!) { (result, error) -> () in
            
            if error != nil {
                print("用户信息请求失败")
                
                finished(isSuccessed: false)
            }
            
            // 提示：如果使用 if let / guard let 统统使用 `?`
            // 作了两个判断
            // 1. result 一定有内容
            // 2. 一定是字典
            guard let dict = result as? [String: AnyObject] else{
                print("格式错误")
                
                finished(isSuccessed: false)
                return
            }
            
            // dict 一定是有字典的值
            // 将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            // 保存用户信息
            NSKeyedArchiver.archiveRootObject(self.account!, toFile: self.accontPath)
            
            // 成功完成回调
            finished(isSuccessed: true)
        }
    }
}



